Ví dụ Dạng chuẩn 1

Các kịch bản sau đây trước tiên minh họa cách thiết kế cơ sở dữ liệu có thể vi phạm 1NF, theo sau là các ví dụ tuân thủ.[4][5]

Các thiết kế vi phạm 1NF

Dưới đây là bảng lưu trữ tên và số điện thoại của khách hàng. Một yêu cầu mặc dù là giữ lại nhiều số điện thoại cho một số khách hàng. Cách đơn giản nhất để đáp ứng yêu cầu này là cho phép các hàng trong cột "Telephone Number" chứa nhiều hơn một giá trị:

Customer
Customer IDFirst NameSurnameTelephone Number
123PoojaSingh555-861-2025, 192-122-1111
456SanZhang(555) 403-1659 Ext. 53; 182-929-2929
789JohnDoe555-808-9633

Cột số điện thoại chứa nhiều số điện thoại trong một giá trị. Ví dụ: hàng đầu tiên có hai số điện thoại được phân tách bằng dấu phẩy. Các giá trị cột không phải là nguyên tố: nó có thể được chia thành hai số. Điều này vi phạm 1NF.

Một giải pháp rõ ràng là đưa ra nhiều cột hơn:

Customer
Customer IDFirst NameSurnameTelephone Number1Telephone Number2
123PoojaSingh555-861-2025192-122-1111
456SanZhang(555) 403-1659 Ext. 53182-929-2929
789JohnDoe555-808-9633

Về mặt kỹ thuật, bảng này không vi phạm yêu cầu về giá trị là nguyên tố. Tuy nhiên, một cách không chính thức, hai cột số điện thoại vẫn tạo thành một "nhóm lặp lại": chúng lặp lại những gì thuộc về khái niệm cùng thuộc tính, cụ thể là số điện thoại. Một thứ tự tùy ý và do đó vô nghĩa đã được đưa ra: tại sao 555-861-2025 được đưa vào cột Số điện thoại1 thay vì cột Số điện thoại2? Không có lý do tại sao khách hàng không thể có nhiều hơn hai số điện thoại, vậy nên có bao nhiêu cột Số điện thoại? Không thể tìm kiếm số điện thoại mà không tìm kiếm số cột tùy ý. Thêm một số điện thoại bổ sung có thể yêu cầu bảng được sắp xếp lại bằng cách thêm một cột mới thay vì chỉ có một hàng mới (tuple) được thêm vào. (Giá trị null cho Số điện thoại2 cho khách hàng 789 cũng là một vấn đề.)

Thiết kế tuân thủ 1NF

Để đưa mô hình về dạng 1NF, chúng tôi chia các chuỗi mà chúng tôi đã sử dụng để giữ thông tin số điện thoại của mình thành các thực thể "nguyên tố" (nghĩa là không thể chia tách): các số điện thoại. Và chúng tôi đảm bảo không có hàng nào chứa nhiều hơn một số điện thoại.

Customer
Customer IDFirst NameSurnameTelephone Number
123PoojaSingh555-861-2025
123PoojaSingh192-122-1111
456SanZhang182-929-2929
456SanZhang(555) 403-1659 Ext. 53
789JohnDoe555-808-9633

Lưu ý rằng "ID" không còn là duy nhất trong giải pháp này với các khách hàng trùng lặp. Để xác định duy nhất một hàng, chúng ta cần sử dụng kết hợp (ID, Số điện thoại). Giá trị của sự kết hợp là duy nhất mặc dù mỗi cột riêng biệt chứa các giá trị lặp lại. Có thể xác định duy nhất một hàng (tuple) là yêu cầu của 1NF.

Một thiết kế thay thế sử dụng hai bảng:

Customer Name
Customer IDFirst NameSurname
123PoojaSingh
456SanZhang
789JohnDoe
Customer Telephone Number
IdCustomer IDTelephone Number
1123555-861-2025
2123192-122-1111
3456(555) 403-1659 Ext. 53
4456182-929-2929
5789555-808-9633

Các cột không chứa nhiều hơn một số điện thoại trong thiết kế này. Thay vào đó, mỗi liên kết Customer-to-Telephone Number xuất hiện trên hàng riêng của mình. Sử dụngCustomer ID làm khoá chính, tồn tại mối quan hệ một-nhiều giữa tên và bảng số. Một hàng trong bảng "cha", Customer Name, có thể được liên kết với nhiều hàng số điện thoại trong bảng "con", Customer Telephone Number, nhưng mỗi số điện thoại thuộc về một và chỉ một khách hàng.[6] Điều đáng chú ý là thiết kế này đáp ứng các yêu cầu bổ sung cho Dạng chuẩn hai (2NF)ba(3NF).

Liên quan